package com.itheima.demo9;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//给大明星进行代理
public class ProxyUtil {
    /**
     * 方法的作用：
     *      给明星一个对象，创建一个代理
     *
     * 形参：
     *      被代理的明星对象
     *
     * 返回值：
     *      给明星创建的代理
     *
     * 需求：
     *      外面的人想要大明星唱一首歌
     *      1.获取代理的对象
     *          代理对象 = ProxyUtil.createProxy（大明星的对象）；
     *      2.再调用代理的唱歌方法
     *          代理对象的唱歌方法（）
     */

    public static Star createProxy(BigStar bigStar){
        /*
        public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
        参数一：用于指定哪个类加载
        参数二：指定接口，这些接口用于指定生成的代理长什么样，有哪些方法(可以拥有多个接口)
        参数三：用来指定生成的代理对象要干什么事
        * */
        Star star = (Star) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(),//参数一：用于指定哪个类加载
                new Class[]{Star.class},//参数二：指定接口，这些接口用于指定生成的代理长什么样，有哪些方法(可以拥有多个接口)

                //参数三：用来指定生成的代理对象要干什么事
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /*
                        参数一：代理的对象
                        参数二：要运行的方法  Sing
                        参数三：调用sing方法时，传递的实参
                        * */
                        if ("sing".equals(method.getName())){
                            System.out.println("准备演唱会，收钱");
                        }else if ("dance".equals(method.getName())){
                            System.out.println("准备跳舞，收钱");
                        }
                        //去找大明星开始唱歌或者跳舞
                        //代码的表现形式：调用大明星里面的唱歌或这跳舞的方法

                        return  method.invoke(bigStar,args);//使用暴力反射调用实参对象的方法

                    }
                }
        );
        return star;

    }
}
